package com.b2mining.integration.xml;

import java.io.FileWriter;
import java.io.PrintWriter;
import java.io.Reader;
import java.io.Writer;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;

import org.apache.log4j.Logger;
import org.exolab.castor.mapping.Mapping;
import org.jdom.CDATA;
import org.jdom.DocType;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.output.XMLOutputter;

import com.b2mining.integration.beans.Detraccion;
import com.b2mining.integration.beans.DetraccionItem;
import com.b2mining.integration.beans.Empresa;
import com.b2mining.integration.beans.XMLBean;
import com.b2mining.integration.controllers.XMLEmpresasController;
import com.b2mining.integration.helper.Constantes;
import com.b2mining.integration.helper.Helper;
import com.b2mining.integration.helper.RequiredElementHelper;
import com.b2mining.integration.mq.MQIntegrationMessage;

/**
 * Clase 
 * @since 26/07/2007
 * @author adminebiz <BR>
 * Analista Programador: Richard Linares
 */
public class DetraccionXMLMapper extends XMLMapper {
	Logger log = Logger.getLogger(this.getClass());
	static DetraccionXMLMapper controller;    
    Mapping map;
    

	public static DetraccionXMLMapper getInstance() {
		 if(controller==null){
		        controller = new DetraccionXMLMapper();
		    }
		    return controller;
	}
	
	public void generateXML(XMLBean bean, Writer stream) throws XMLMapperException {
		
		log.debug("DetraccionXMLMapper: Metodo : generateXML : INICIO");
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(Constantes.DATEFORMAT);
        SimpleDateFormat fechaInterna = new SimpleDateFormat("MM/dd/yyyy");
        XMLOutputter outputter = new XMLOutputter();
        outputter.setNewlines(true);
        outputter.setIndent(Constantes.TAB);
        outputter.setEncoding(Constantes.ENCODING_XML);        
        Document doc = new Document();
        
        
        DocType dt = new DocType("DETUPLOAD", "det_upload_mq.dtd");
        Element element = null;
        doc.setDocType(dt);
        Element root = new Element("DETUPLOAD");
        doc.setRootElement(root);
		Detraccion detraccion = (Detraccion)bean;
		DetraccionItem detraccionItem = null;
		//boolean mivariable=false;
		
		/*por Rhandy 11-05-2010*/
		String value="";
		CDATA cdata = null;
		/**/
		
		//DetraccionDBMapper detracionDBMapper =new DetraccionDBMapper();
        
		if (detraccion.getRucComprador()!=null){
			element = new Element("RucComprador");
			element.setText(detraccion.getRucComprador());
			root.addContent(element);			
		}else{
			element = new Element("RucComprador");
			element.setText("");
			root.addContent(element);			
		}
		
		if (detraccion.getRucProveedor()!=null){
			element = new Element("RucProveedor");
			element.setText(detraccion.getRucProveedor());
			root.addContent(element);
		}else{
			element = new Element("RucProveedor");
			element.setText("");
			root.addContent(element);
		}
			
		if (detraccion.getDireccionProveedor()!=null){
//			element = new Element("DireccionProveedor");
//			element.setText(detraccion.getDireccionProveedor());
			
			/*por Rhandy 11-05-2010 */
			value=detraccion.getDireccionProveedor();
			cdata = new CDATA(value);
			element = new Element("DireccionProveedor");
			element.addContent(cdata);
			root.addContent(element);
			/**/ 
		}else{
			element = new Element("DireccionProveedor");
			element.setText("");
			root.addContent(element);
		}
		
		if (detraccion.getRazonSocialProveedor()!=null){
//			element = new Element("RazonSocialProveedor");
//			element.setText(detraccion.getRazonSocialProveedor());
//			root.addContent(element);
			
			/*por Rhandy 11-05-2010 */
			value=detraccion.getRazonSocialProveedor();
			cdata = new CDATA(value);
			element = new Element("RazonSocialProveedor");
			element.addContent(cdata);
			root.addContent(element);
			/**/ 
		}else{
			element = new Element("RazonSocialProveedor");
			element.setText("");
			root.addContent(element);
		}
		
		if (detraccion.getNumeroConstancia()!=null){
			element = new Element("NumeroConstancia");
			element.setText(detraccion.getNumeroConstancia());
			root.addContent(element);
		}else{
			element = new Element("NumeroConstancia");
			element.setText("");
			root.addContent(element);
		}
		
		if (detraccion.getNumCuentaNacionProveedor()!=null){
			element = new Element("NumCuentaNacionProveedor");
			element.setText(detraccion.getNumCuentaNacionProveedor());
			root.addContent(element);
		}
		
		if (detraccion.getTipoOperacion()!=null){
			element = new Element("TipoOperacion");
			element.setText(detraccion.getTipoOperacion());
			root.addContent(element);
		}else{
			element = new Element("TipoOperacion");
			element.setText("");
			root.addContent(element);
		}
		
		if (detraccion.getTipoBienServicio()!=null){
			element = new Element("TipoBienServicio");
			element.setText(detraccion.getTipoBienServicio());
			root.addContent(element);
		}else{
			element = new Element("TipoBienServicio");
			element.setText("");
			root.addContent(element);
		}
		
		if (detraccion.getNumeroOperacion()!=null){
			element = new Element("NumeroOperacion");
			element.setText(detraccion.getNumeroOperacion());
			root.addContent(element);
		}
		
		if (detraccion.getMontoDeposito()!=0){
			element = new Element("MontoDeposito");
			element.setText(String.valueOf(detraccion.getMontoDeposito()));
			root.addContent(element);
		}else{
			element = new Element("MontoDeposito");
			element.setText("");
			root.addContent(element);
		}
		
		if (detraccion.getMoneda()!=null){
			element = new Element("Moneda");
			element.setText(detraccion.getMoneda());
			root.addContent(element);
		}else{
			element = new Element("Moneda");
			element.setText("");
			root.addContent(element);
		}
		
		if (detraccion.getFechaHoraPago()!=null){
			element = new Element("FechaHoraPago");
			element.setText(simpleDateFormat.format(detraccion.getFechaHoraPago()));
			root.addContent(element);
		}else{
			element = new Element("FechaHoraPago");
			element.setText("");
			root.addContent(element);
		}
		
		if(detraccion.getObservacion()!=null){
			element = new Element("Observacion");
			element.setText(detraccion.getObservacion());
			root.addContent(element);
		}
		
		if(detraccion.getNumeroDocPagoERP()!=null){
			element = new Element("NumeroDocPagoERP");
			element.setText(detraccion.getNumeroDocPagoERP());
			root.addContent(element);
		}
		
		if(detraccion.getStatus()!=null){
			element = new Element("Generacion");
			element.setText(detraccion.getStatus());
			root.addContent(element);
		}
		
		if (detraccion.getItemCount()>0){
			log.info("Numero de items de la detraccion: "+detraccion.getItemCount());
			for (int i=0;i<detraccion.getItemCount();i++){
				
			
				//Element elementOffering = new Element("OfferingProductCode");
				Element elementItem = new Element("DetalleDetraccion");
				
				
				detraccionItem = (DetraccionItem)detraccion.getItem(i);
				
				if (detraccionItem.getTipoDocumento()!=null){
					element = new Element("TipoDocumento");
					element.setText(detraccionItem.getTipoDocumento());
					elementItem.addContent(element);
				} else{
					element = new Element("TipoDocumento");
					element.setText("");
					elementItem.addContent(element);
				}
				
				if (detraccionItem.getTipoDocumento()!=null){
					element = new Element("SerieDocumento");
					element.setText(detraccionItem.getSerieDocumento());
					elementItem.addContent(element);
				} else{
					element = new Element("SerieDocumento");
					element.setText("");
					elementItem.addContent(element);
				}
				if (detraccionItem.getTipoDocumento()!=null){
					element = new Element("NumeroDocumento");
					element.setText(detraccionItem.getNumeroDocumento());
					elementItem.addContent(element);
				} else{
					element = new Element("NumeroDocumento");
					element.setText("");
					elementItem.addContent(element);
				}
				if (detraccionItem.getFechaDocumento()!=null){
					element = new Element("FechaDocumento");
					element.setText(fechaInterna.format(detraccionItem.getFechaDocumento()));
					elementItem.addContent(element);
				}else{
					element = new Element("FechaDocumento");
					element.setText("");
					elementItem.addContent(element);
				}
				if (String.valueOf(detraccionItem.getMontoPago())!=null){
					element = new Element("MontoPago");
					element.setText(String.valueOf(detraccionItem.getMontoPago()));
					elementItem.addContent(element);
				}else{
					element = new Element("MontoPago");
					element.setText("");
					elementItem.addContent(element);
				}
				
				if (String.valueOf(detraccionItem.getMontoDetractado())!=null){
					element = new Element("MontoDetractado");
					element.setText(String.valueOf(detraccionItem.getMontoDetractado()));
					elementItem.addContent(element);
				}else{
					element = new Element("MontoDetractado");
					element.setText("");
					elementItem.addContent(element);
				}
				
				if (detraccionItem.getMoneda()!=null){
					element = new Element("Monedadet");
					element.setText(detraccionItem.getMoneda());
					elementItem.addContent(element);
				} else{
					element = new Element("Monedadet");
					element.setText("");
					elementItem.addContent(element);
				}
				root.addContent(elementItem);
			}
		}
		XMLMapperException ex = new XMLMapperException();
		//log.debug("Antes de hacer la validacion del documento");
		validaDocumento(outputter.outputString(doc) , ex);
		log.debug(" QQQQQQQQQQQQQQ Contenido de ex : " + ex.getChildrenCount());
			if (ex.getChildrenCount()>0){
				for (int imprime=0;imprime<ex.getChildrenCount();imprime++){
					log.debug(" QQQQQQQQQQQQQQ Contenido de ex : " + ex.getChild(imprime).getError());
				}
			}
			
		if (ex.getChildrenCount()>0) {
			log.fatal(""+ex.getMessage());
			throw ex;
		}
        try{
            outputter.output(doc, stream);
            log.info(" XML generado correctamente");
        }
        catch(Exception e){	
            	throw new XMLMapperException("Error al tratar de escribir el XML Detraccion hacia la ruta de salida.");
        }
        log.debug("DetraccionXMLMapper: Metodo : generateXML : FIN");
	}

//	public boolean validateBeanporXML(XMLBean bean, Writer stream)  {
//		log.debug("DetraccionXMLMapper: Metodo : validateBeanporXML : INICIO");
//        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(Constantes.DATEFORMAT);
//        SimpleDateFormat fechaInterna = new SimpleDateFormat("MM/dd/yyyy");
//        XMLOutputter outputter = new XMLOutputter();
//        outputter.setNewlines(true);
//        outputter.setIndent(Constantes.TAB);
//        outputter.setEncoding(Constantes.ENCODING_XML);        
//        Document doc = new Document();
//        DocType dt = new DocType("DETUPLOAD", "det_upload_mq.dtd");
//        Element element = null;
//        doc.setDocType(dt);
//        Element root = new Element("DETUPLOAD");
//        doc.setRootElement(root);
//		Detraccion detraccion = (Detraccion)bean;
//		DetraccionItem detraccionItem = null;
//		boolean mivariable=false;
//		//DetraccionDBMapper detracionDBMapper =new DetraccionDBMapper();
//        
//		if (detraccion.getRucComprador()!=null){
//			element = new Element("RucComprador");
//			element.setText(detraccion.getRucComprador());
//			root.addContent(element);			
//		}
//		else{
//			element = new Element("RucComprador");
//			element.setText("");
//			root.addContent(element);			
//		}
//		 mivariable=true;
//		if (detraccion.getRucProveedor()!=null){
//			element = new Element("RucProveedor");
//			element.setText(detraccion.getRucProveedor());
//			root.addContent(element);
//		}
//		else{
//			element = new Element("RucProveedor");
//			element.setText("");
//			root.addContent(element);
//		}
//		mivariable=true;	
//		if (detraccion.getDireccionProveedor()!=null){
//			element = new Element("DireccionProveedor");
//			element.setText(detraccion.getDireccionProveedor());
//			root.addContent(element);
//		}else{
//			element = new Element("DireccionProveedor");
//			element.setText("");
//			root.addContent(element);
//		}
//		mivariable=true;
//		if (detraccion.getRazonSocialProveedor()!=null){
//			element = new Element("RazonSocialProveedor");
//			element.setText(detraccion.getRazonSocialProveedor());
//			root.addContent(element);
//		}
//		else{
//			element = new Element("RazonSocialProveedor");
//			element.setText("");
//			root.addContent(element);
//		}
//		mivariable=true;
//		if (detraccion.getNumeroConstancia()!=null){
//			element = new Element("NumeroConstancia");
//			element.setText(detraccion.getNumeroConstancia());
//			root.addContent(element);
//		}else{
//			element = new Element("NumeroConstancia");
//			element.setText("");
//			root.addContent(element);
//		}
//		mivariable=true;
//		if (detraccion.getNumCuentaNacionProveedor()!=null){
//			element = new Element("NumCuentaNacionProveedor");
//			element.setText(detraccion.getNumCuentaNacionProveedor());
//			root.addContent(element);
//		}
//		mivariable=true;
//		if (detraccion.getTipoOperacion()!=null){
//			element = new Element("TipoOperacion");
//			element.setText(detraccion.getTipoOperacion());
//			root.addContent(element);
//		}else{
//			element = new Element("TipoOperacion");
//			element.setText("");
//			root.addContent(element);
//		}
//		mivariable=true;
//		if (detraccion.getTipoBienServicio()!=null){
//			element = new Element("TipoBienServicio");
//			element.setText(detraccion.getTipoBienServicio());
//			root.addContent(element);
//		}else{
//			element = new Element("TipoBienServicio");
//			element.setText("");
//			root.addContent(element);
//		}
//		mivariable=true;
//		if (detraccion.getNumeroOperacion()!=null){
//			element = new Element("NumeroOperacion");
//			element.setText(detraccion.getNumeroOperacion());
//			root.addContent(element);
//		}
//		mivariable=true;
//		if (detraccion.getMontoDeposito()!=0){
//			element = new Element("MontoDeposito");
//			element.setText(String.valueOf(detraccion.getMontoDeposito()));
//			root.addContent(element);
//		}else{
//			element = new Element("MontoDeposito");
//			element.setText("");
//			root.addContent(element);
//		}
//		mivariable=true;
//		if (detraccion.getMoneda()!=null){
//			element = new Element("Moneda");
//			element.setText(detraccion.getMoneda());
//			root.addContent(element);
//		}else{
//			element = new Element("Moneda");
//			element.setText("");
//			root.addContent(element);
//		}
//		mivariable=true;
//		if (detraccion.getFechaHoraPago()!=null){
//			element = new Element("FechaHoraPago");
//			element.setText(simpleDateFormat.format(detraccion.getFechaHoraPago()));
//			root.addContent(element);
//		}else{
//			element = new Element("FechaHoraPago");
//			element.setText("");
//			root.addContent(element);
//		}
//		mivariable=true;
//		if(detraccion.getObservacion()!=null){
//			element = new Element("Observacion");
//			element.setText(detraccion.getObservacion());
//			root.addContent(element);
//		}else{
//			element = new Element("Observacion");
//			element.setText("");
//			root.addContent(element);
//		}
//		mivariable=true;
//		if(detraccion.getNumeroDocPagoERP()!=null){
//			element = new Element("NumeroDocPagoERP");
//			element.setText(detraccion.getNumeroDocPagoERP());
//			root.addContent(element);
//		}else{
//			element = new Element("NumeroDocPagoERP");
//			element.setText("");
//			root.addContent(element);
//		}
//		mivariable=true;
//		if(detraccion.getStatus()!=null){
//			element = new Element("Generacion");
//			element.setText(detraccion.getStatus());
//			root.addContent(element);
//		}else{
//			element = new Element("Generacion");
//			element.setText("");
//			root.addContent(element);
//		}
//		mivariable=true;
//		if (detraccion.getItemCount()>0){
//			for (int i=0;i<detraccion.getItemCount();i++){
//				
//			
//				//Element elementOffering = new Element("OfferingProductCode");
//				Element elementItem = new Element("DetalleDetraccion");
//				
//				
//				detraccionItem = (DetraccionItem)detraccion.getItem(i);
//				
//				if (detraccionItem.getTipoDocumento()!=null){
//					element = new Element("TipoDocumento");
//					element.setText(detraccionItem.getTipoDocumento());
//					elementItem.addContent(element);
//				} else{
//					element = new Element("TipoDocumento");
//					element.setText("");
//					elementItem.addContent(element);
//				}
//				mivariable=true;
//				if (detraccionItem.getTipoDocumento()!=null){
//					element = new Element("SerieDocumento");
//					element.setText(detraccionItem.getSerieDocumento());
//					elementItem.addContent(element);
//				} else{
//					element = new Element("SerieDocumento");
//					element.setText("");
//					elementItem.addContent(element);
//				}
//				mivariable=true;
//				if (detraccionItem.getTipoDocumento()!=null){
//					element = new Element("NumeroDocumento");
//					element.setText(detraccionItem.getNumeroDocumento());
//					elementItem.addContent(element);
//				} else{
//					element = new Element("NumeroDocumento");
//					element.setText("");
//					elementItem.addContent(element);
//				}
//				mivariable=true;
//				if (detraccionItem.getFechaDocumento()!=null){
//					element = new Element("FechaDocumento");
//					element.setText(fechaInterna.format(detraccionItem.getFechaDocumento()));
//					elementItem.addContent(element);
//				}else{
//					element = new Element("FechaDocumento");
//					element.setText("");
//					elementItem.addContent(element);
//				}
//				mivariable=true;
//				
//				element = new Element("MontoPago");
//				element.setText(String.valueOf(detraccionItem.getMontoPago()));
//				elementItem.addContent(element);
//				mivariable=true;
//				
//				element = new Element("MontoDetractado");
//				element.setText(String.valueOf(detraccionItem.getMontoDetractado()));
//				elementItem.addContent(element);
//				mivariable=true;
//				
//				if (detraccionItem.getMoneda()!=null){
//					element = new Element("Monedadet");
//					element.setText(detraccionItem.getMoneda());
//					elementItem.addContent(element);
//				} else{
//					element = new Element("Monedadet");
//					element.setText("");
//					elementItem.addContent(element);
//				}
//				mivariable=true;
//				root.addContent(elementItem);
//			}
//		}
//		XMLMapperException ex = new XMLMapperException();
//		//log.debug("Antes de hacer la validacion del documento");
//		validaDocumento(outputter.outputString(doc) , ex);
//		log.info(" QQQQQQQQQQQQQQ Contenido de ex : " + ex.getChildrenCount());
//		log.info(" QQQQQQQQQQQQQQ Contenido de ex : " + ex.getChild(0).getError());
//		if (ex.getChildrenCount()>0) {
//			//throw ex;
//			mivariable=false;
//		}
//		log.debug("DetraccionXMLMapper: Metodo : validateBeanporXML : FIN");
//        try{
//            outputter.output(doc, stream);
//            mivariable=true;
//        }
//        catch(Exception e){	
//            	//throw new XMLMapperException("Error al tratar de escribir el XML Detraccion hacia la ruta de salida.");
//            mivariable=false;	
//        }  
//        return ;
//	}

	public XMLBean parseXML(Reader stream, Reader streamAux) throws XMLMapperException {
		log.debug("Inicio XML parserXML");
	    Detraccion detraccion = null;
	    DetraccionItem detraccionItem = null;
	   
	    boolean hasErrors = false;
	    String dateFormat = Constantes.DATEFORMAT;
	    SimpleDateFormat simpleDateFormat = new SimpleDateFormat(dateFormat);

	    Document doc = null;			
		XMLMapperException ex = new XMLMapperException();
	
		try {
			doc = validaDocumento(stream, streamAux , ex);
			if (doc==null) {
				log.debug("Documento nulo, no sirve");
				throw ex;
			}
			Element docroot = doc.getRootElement();
			
			//aav 20040428
			RequiredElementHelper reHelper= new RequiredElementHelper();
			String documentName = docroot.getName();
			String value=null;
			// aav.          	
			detraccion = new Detraccion();
			
			value =  reHelper.checkValue(docroot.getChild("RucComprador") );
			detraccion.setRucComprador(value);

			value =  reHelper.checkValue(docroot.getChild("RucProveedor") );
			detraccion.setRucProveedor(value);
			
			value =  reHelper.checkValue(docroot.getChild("DireccionProveedor") );
			detraccion.setDireccionProveedor(value);
					
			value =  reHelper.checkValue(docroot.getChild("RazonSocialProveedor") );
			detraccion.setRazonSocialProveedor(value);
					
			value =  reHelper.checkValue(docroot.getChild("NumeroConstancia") );
			detraccion.setNumeroConstancia(value);
					
			value =  reHelper.checkValue(docroot.getChild("NumCuentaNacionProveedor") );
			if(value!=null){
				detraccion.setNumCuentaNacionProveedor(value);
				log.debug("NumCuentaNacionProveedor "+value);
			}
			
			value =  reHelper.checkValue(docroot.getChild("TipoOperacion") );
			detraccion.setTipoOperacion(value);
			
			value =  reHelper.checkValue(docroot.getChild("TipoBienServicio") );
			detraccion.setTipoBienServicio(value);
			
			value =  reHelper.checkValue(docroot.getChild("NumeroOperacion") );
			if(value!=null){
				detraccion.setNumeroOperacion(value);
				log.debug("NumeroOperacion "+value);
			}
			
			value =  reHelper.checkValue(docroot.getChild("MontoDeposito") );
			detraccion.setMontoDeposito(Double.parseDouble(value));
			
			value =  reHelper.checkValue(docroot.getChild("Moneda") );
			detraccion.setMoneda(value);
			
			value =  reHelper.checkValue(docroot.getChild("FechaHoraPago") );
			try{
				detraccion.setFechaHoraPago(reHelper.parseDate(value, simpleDateFormat));
			}
			catch(Exception e){
                
                FormatException fe = new FormatException(1);
                fe.setDateFormat(dateFormat);
                fe.setElement("FechaHoraPago");
                fe.setParent(docroot);
                ex.addChild(fe);
			}
			value =  reHelper.checkValue(docroot.getChild("Observacion"));
			if(value!=null){
				log.debug("Observacion "+value);
				detraccion.setObservacion(value);
			}
			
			value =  reHelper.checkValue(docroot.getChild("NumerdoDocPagoERP"));
			if(value!=null){
				log.debug("NumerdoDocPagoERP "+value);
				detraccion.setNumeroDocPagoERP(value);
			}
			
			value =  reHelper.checkValue(docroot.getChild("Generacion"));
			if(value!=null){
				log.debug("Generacion "+value);
				detraccion.setStatus(value);
			}
			
			//log.debug("Llego aqui2");	
			List detraccionList = docroot.getChildren("DetalleRetencion");
			

			if (detraccionList!=null){
				//log.debug("Hay elementos "+retencionList.size());
				for (int i=0;i<detraccionList.size();i++){
					//log.debug("entro al for, Detalle Retencion");
					Element elementItem = (Element)detraccionList.get(i);
					detraccionItem = new DetraccionItem();
					
		    	    value =  reHelper.checkValue( elementItem.getChild("TipoDocumento") );
		    	    detraccionItem.setTipoDocumento(value);
					
					value =  reHelper.checkValue( elementItem.getChild("SerieDocumento") );
					detraccionItem.setSerieDocumento(value);
					
					value =  reHelper.checkValue( elementItem.getChild("NumeroDocumento") );
					detraccionItem.setNumeroDocumento(value);
					
					value =  reHelper.checkValue(elementItem.getChild("FechaDocumento") );
					try{
						//log.debug("try ");
						simpleDateFormat = new SimpleDateFormat("MM/dd/yyyy");
						detraccionItem.setFechaDocumento(reHelper.parseDate(value, simpleDateFormat));
					}
					catch(Exception e){
						log.error("catch "+e.getMessage());
		                FormatException fe = new FormatException(1);
		                fe.setDateFormat(dateFormat);
		                fe.setElement("FechaDocumento");
		                fe.setParent(docroot);
		                ex.addChild(fe);
					}
					//log.debug("estoy aqui");
					try{
						//log.debug("entro al for, Detalle Retencion1");
						value =  reHelper.checkValue(elementItem.getChild("MontoPago") );
						detraccionItem.setMontoPago(Double.parseDouble(value));
	
						value =  reHelper.checkValue(elementItem.getChild("MontoDetractado") );
						detraccionItem.setMontoDetractado(Double.parseDouble(value));
						//log.debug("entro al for, Detalle Retencion2");
						value =  reHelper.checkValue( elementItem.getChild("Moneda") );
						detraccionItem.setMoneda(value);
						//log.debug("entro al for, Detalle Retencion3");
					}
					catch(NumberFormatException nfe){
						nfe.printStackTrace();
						log.error("error de lectura");
					}
					detraccion.addItem(detraccionItem);
					//log.debug("hasta aqui");
				}
			}
		} 
		catch (Exception e) {
			e.printStackTrace();
		    throw new XMLMapperException("Error Parser "+e.toString());
		}
						//aav.
		if (ex.getChildrenCount()>0) {
			//log.debug("Otro error en el parse");
			throw ex;
		}
		//.
		if(detraccion!=null)
			log.debug("Fin XML parserXML");
		/*else
			log.debug("Fin XML parserXML nulo");*/
		return detraccion;
	}

	protected void validaContenido(Document doc, XMLMapperException ex) {
		Element docroot=null;    
        log.debug("DetraccionXMLMapper: Metodo : validaContenido : INICIO");
		try {
			docroot = doc.getRootElement();
			
			RequiredElementHelper reHelper= new RequiredElementHelper();
			String documentName = docroot.getName();
	
			String value=null;
			value =  reHelper.checkValue(docroot.getChild("RucComprador") );
			//log.debug("campo "+value);
			if (!reHelper.isCorrect(documentName,"RucComprador", value ))  {
	            
	            MissingElementException mee = new MissingElementException();
	            mee.setElement("RucComprador");
	            mee.setParent(docroot);
	            ex.addChild(mee);
			}
			value =  reHelper.checkValue(docroot.getChild("RucProveedor") );
			//log.debug("campo "+value);
			if (!reHelper.isCorrect(documentName,"RucProveedor", value ))  {
	            
	            MissingElementException mee = new MissingElementException();
	            mee.setElement("RucProveedor");
	            mee.setParent(docroot);
	            ex.addChild(mee);
			}
			value =  reHelper.checkValue(docroot.getChild("DireccionProveedor") );
			//log.debug("campo "+value);
			if (!reHelper.isCorrect(documentName,"DireccionProveedor", value ))  {
	            
	            MissingElementException mee = new MissingElementException();
	            mee.setElement("DireccionProveedor");
	            mee.setParent(docroot);
	            ex.addChild(mee);
			}
			value =  reHelper.checkValue(docroot.getChild("RazonSocialProveedor") );
			//log.debug("campo "+value);
			if (!reHelper.isCorrect(documentName,"RazonSocialProveedor", value ))  {
	            
	            MissingElementException mee = new MissingElementException();
	            mee.setElement("RazonSocialProveedor");
	            mee.setParent(docroot);
	            ex.addChild(mee);
			}
			value =  reHelper.checkValue(docroot.getChild("NumeroConstancia") );
			//log.debug("campo "+value);
			if (!reHelper.isCorrect(documentName,"NumeroConstancia", value ))  {
	            
	            MissingElementException mee = new MissingElementException();
	            mee.setElement("NumeroConstancia");
	            mee.setParent(docroot);
	            ex.addChild(mee);
			}		
			value =  reHelper.checkValue(docroot.getChild("NumCuentaNacionProveedor") );
			//log.debug("campo "+value);
			if (!reHelper.isCorrect(documentName,"NumCuentaNacionProveedor", value ))  {
	            
	            MissingElementException mee = new MissingElementException();
	            mee.setElement("NumCuentaNacionProveedor");
	            mee.setParent(docroot);
	            ex.addChild(mee);
			}
			value =  reHelper.checkValue(docroot.getChild("TipoOperacion") );
			//log.debug("campo "+value);
			if (!reHelper.isCorrect(documentName,"TipoOperacion", value ))  {
	            
	            MissingElementException mee = new MissingElementException();
	            mee.setElement("TipoOperacion");
	            mee.setParent(docroot);
	            ex.addChild(mee);
			}
			value =  reHelper.checkValue(docroot.getChild("TipoBienServicio") );
			//log.debug("campo "+value);
			if (!reHelper.isCorrect(documentName,"TipoBienServicio", value ))  {
	            
	            MissingElementException mee = new MissingElementException();
	            mee.setElement("TipoBienServicio");
	            mee.setParent(docroot);
	            ex.addChild(mee);
			}
			value =  reHelper.checkValue(docroot.getChild("NumeroOperacion") );
			//log.debug("campo "+value);
			if (!reHelper.isCorrect(documentName,"NumeroOperacion", value ))  {
	            
	            MissingElementException mee = new MissingElementException();
	            mee.setElement("NumeroOperacion");
	            mee.setParent(docroot);
	            ex.addChild(mee);
			}
			value =  reHelper.checkValue(docroot.getChild("MontoDeposito") );
			//log.debug("campo "+value);
			if (!reHelper.isCorrect(documentName,"MontoDeposito", value ))  {
	            
	            MissingElementException mee = new MissingElementException();
	            mee.setElement("MontoDeposito");
	            mee.setParent(docroot);
	            ex.addChild(mee);
			}
			value =  reHelper.checkValue(docroot.getChild("Moneda") );
			//log.debug("campo "+value);
			if (!reHelper.isCorrect(documentName,"Moneda", value ))  {
	            
	            MissingElementException mee = new MissingElementException();
	            mee.setElement("Moneda");
	            mee.setParent(docroot);
	            ex.addChild(mee);
			}
			value =  reHelper.checkValue(docroot.getChild("FechaHoraPago") );
			//log.debug("campo "+value);
			if (!reHelper.isCorrect(documentName,"FechaHoraPago", value ))  {
	            
	            MissingElementException mee = new MissingElementException();
	            mee.setElement("FechaHoraPago");
	            mee.setParent(docroot);
	            ex.addChild(mee);
			}
			
			value =  reHelper.checkValue(docroot.getChild("Observacion") );
			//log.debug("campo "+value);
			if (!reHelper.isCorrect(documentName,"Observacion", value ))  {
	            
	            MissingElementException mee = new MissingElementException();
	            mee.setElement("Observacion");
	            mee.setParent(docroot);
	            ex.addChild(mee);
			}
			
			value =  reHelper.checkValue(docroot.getChild("NumeroDocPagoERP") );
			//log.debug("campo "+value);
			if (!reHelper.isCorrect(documentName,"NumeroDocPagoERP", value ))  {
	            
	            MissingElementException mee = new MissingElementException();
	            mee.setElement("NumeroDocPagoERP");
	            mee.setParent(docroot);
	            ex.addChild(mee);
			}
			
			value =  reHelper.checkValue(docroot.getChild("Generacion") );
			//log.debug("campo "+value);
			if (!reHelper.isCorrect(documentName,"Generacion", value ))  {
	            
	            MissingElementException mee = new MissingElementException();
	            mee.setElement("Generacion");
	            mee.setParent(docroot);
	            ex.addChild(mee);
			}
//			
			List retentionList = docroot.getChildren("DetalleDetraccion");
			if ((retentionList==null||retentionList.size()==0) && reHelper.isRequiredGroup(documentName,"DetalleDetraccion")) {
				MissingGroupException mge =		new MissingGroupException();
				mge.setElement("DetalleDetraccion");
				mge.setParent(docroot);
				ex.addChild(mge);
			}
			
			
			
			if (retentionList!=null){
				for (int i=0;i<retentionList.size();i++){
					Element elementItem = (Element)retentionList.get(i);
					
					
		    	    value =  reHelper.checkValue( elementItem.getChild("TipoDocumento") );
		    	    //log.debug("campo "+value);
					if (!reHelper.isCorrect(documentName,"TipoDocumento", value )){
			            
			            MissingElementException mee = new MissingElementException();
			            mee.setElement("TipoDocumento");
			            mee.setParent(elementItem);
			            ex.addChild(mee);
					}
					
					value =  reHelper.checkValue( elementItem.getChild("SerieDocumento") );
					//log.debug("campo "+value);
					if (!reHelper.isCorrect(documentName,"SerieDocumento", value )){
			            
			            MissingElementException mee = new MissingElementException();
			            mee.setElement("SerieDocumento");
			            mee.setParent(elementItem);
			            ex.addChild(mee);
					}
					value =  reHelper.checkValue( elementItem.getChild("NumeroDocumento") );
					//log.debug("campo "+value);
					if (!reHelper.isCorrect(documentName,"NumeroDocumento", value )){
			            
			            MissingElementException mee = new MissingElementException();
			            mee.setElement("NumeroDocumento");
			            mee.setParent(elementItem);
			            ex.addChild(mee);
					}
					value =  reHelper.checkValue( elementItem.getChild("FechaDocumento") );
					//log.debug("campo "+value);
					if (!reHelper.isCorrect(documentName,"FechaDocumento", value )){
			            
			            MissingElementException mee = new MissingElementException();
			            mee.setElement("FechaDocumento");
			            mee.setParent(elementItem);
			            ex.addChild(mee);
					}
					value =  reHelper.checkValue( elementItem.getChild("MontoPago") );
					//log.debug("campo "+value);
					if (!reHelper.isCorrect(documentName,"MontoPago", value )){
			            
			            MissingElementException mee = new MissingElementException();
			            mee.setElement("MontoPago");
			            mee.setParent(elementItem);
			            ex.addChild(mee);
					}
					value =  reHelper.checkValue( elementItem.getChild("MontoDetractado") );
					//log.debug("campo "+value);
					if (!reHelper.isCorrect(documentName,"MontoDetractado", value )){
			            
			            MissingElementException mee = new MissingElementException();
			            mee.setElement("MontoDetractado");
			            mee.setParent(elementItem);
			            ex.addChild(mee);
					}
					value =  reHelper.checkValue( elementItem.getChild("Monedadet") );
					//log.debug("campo "+value);
					if (!reHelper.isCorrect(documentName,"Monedadet", value )){
			            
			            MissingElementException mee = new MissingElementException();
			            mee.setElement("Monedadet");
			            mee.setParent(elementItem);
			            ex.addChild(mee);
					}
				
				}
			}
			log.debug("$$$$$$$$$$$$$$$$$$$ validando XML correctamente");	
		} 
		catch (Exception e) {
			log.debug("Error xml mapper"+e.toString());
		   	 ex.addChild(new  XMLMapperException(e.toString()));
		}
						//aav.
		//log.debug("Antes de cerrar"+ docroot.toString());
		log.debug("DetraccionXMLMapper: Metodo : validaContenido : FIN");
	}


	public void generateXML(XMLBean beanList, Writer stream, int contador)
			throws XMLMapperException {
		// TODO Auto-generated method stub
		
	}

	public boolean registrarXML (MQIntegrationMessage message, Detraccion det) throws Exception{
        log.debug("RetentionXMLMapper - registrarXML :  INICIO ");
		String nameFile = "";
		String auxliar="";
	/*	String orgid = "";
		String userid = "";
		String action ="";
		String errorCode ="";
		*/
		boolean resultado = false;
		FileWriter fw = null;
		PrintWriter out = null;
		String fileXML="";
		SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyyMMdd_hhmmssSSS");
		
		try{
			nameFile = nameFile + message.getAction().trim()+"_";
			if (message.getDocNumber()!=null)
				nameFile = nameFile + message.getDocNumber().trim()+"_"; 
			nameFile = nameFile + message.getOrgId().trim()+"_";
			nameFile = nameFile + message.getOrgUserId().trim()+"_";
			
			String fechahora = dateFormatter.format(new java.util.Date());
			nameFile = nameFile +"_" +det.getNumeroConstancia()+"_" +fechahora + ".xml";
			//nameFile=TXTReader.varnombre;
			log.info("nameFile del XML a guardar: "+nameFile);
			//log.debug("Accion: "+message.getAction());
			//fileXML = directorioFile(message,nameFile);
			
			//if(Helper.tipoEjecucion.equalsIgnoreCase("MultiEmpresa") && det!=null){
				log.debug("VALOR DE AUXLIAR antes de bsucarEmpresa : "+auxliar);
				//detttttt=(Detraccion)(dc.getBean(0));
				log.debug("detttt : "+det.getRucComprador());
				Empresa eu=new Empresa();
				//eu=buscarRUC(det.getRucComprador());
				eu=cargarinfoEmpresa( det.getRucComprador())  ;
				log.debug("euuu : "+eu.getRAZONSOCIAL());
				auxliar=eu.getRAZONSOCIAL();
				log.debug("VALOR DE AUXLIAR despues de buscarEmpresa : "+auxliar);
				fileXML =fileXML+"\\"+ Helper.rutaarchivoxml+"\\"+auxliar+"\\"+Constantes.DIR_DETRACCIONES+"\\"+nameFile;
			/*}else{
				fileXML =fileXML+"\\"+ Helper.rutaarchivoxml+"\\"+Helper.rutaempresa+"\\"+Constantes.DIR_DETRACCIONES+"\\"+nameFile;
			}	*/	
			
			/*if(Helper.tipoEjecucion.equalsIgnoreCase("MultiEmpresa"))
				fileXML =fileXML+"\\"+ Helper.rutaarchivoxml+"\\"+message.getCarpetaAlm()+"\\"+Constantes.DIR_DETRACCIONES+"\\"+nameFile;
			else
				fileXML =fileXML+"\\"+ Helper.rutaarchivoxml+"\\"+Helper.rutaempresa+"\\"+Constantes.DIR_DETRACCIONES+"\\"+nameFile;*/
			
			fw = new FileWriter(fileXML,false);
			out = new PrintWriter(fw);
			out.println(message.getBody());
			log.debug("###############////////////////////// despues de crear el XML con cuerpo: " + message.getBody());
		 	log.debug("Archivo XML Almacenado en: "+fileXML);	
		 	
		 	resultado=true;
		}
		catch (Exception e){
			log.fatal("Error al registrar el XML :"+e,e);
			resultado = false;
			throw e;
		}
		finally {
			try {
				if (fw != null)
					fw.close();
				if (out != null)
					out.close();
					
			} 
			catch (Exception e) {
			}
		}
		return resultado;
	}

	@Override
	protected void validaContenido2(Document doc, XMLMapperException ex) {
		// TODO Auto-generated method stub
		
	}

	/*private Empresa buscarRUC(String rucc) {
		Empresa eee=new Empresa();
			for(int csm=0;csm<IntegracionSFTPMultiempresa.empresas.size();csm++){
				if(((Empresa)IntegracionSFTPMultiempresa.empresas.get(csm)).getRUC().equalsIgnoreCase(rucc)){
					eee=(Empresa)IntegracionSFTPMultiempresa.empresas.get(csm);
				}
			}
		return eee;
	}*/
	
	private Empresa cargarinfoEmpresa(String rucCliente) {
		// TODO Auto-generated method stub
		XMLEmpresasController micont=XMLEmpresasController.getInstance();
		ArrayList<Empresa> arraybusqueda= micont.getEmpresas();
		if (arraybusqueda.size()>0)
			log.debug("tamao de arraybusqueda: "+arraybusqueda.size());
		Empresa temporal=new Empresa();
		
		if(rucCliente.length()==11){
			for(int g=0;g<arraybusqueda.size();g++){
				log.debug("comparando >>> arraybusqueda.get(g).getRUC():"+arraybusqueda.get(g).getRUC().substring(2)+" y rucCliente: "+rucCliente);
				if(arraybusqueda.get(g).getRUC().substring(2).equalsIgnoreCase(rucCliente)){
					temporal= arraybusqueda.get(g);
					break;
				}	
			}
		}else if(rucCliente.length()==13){
			for(int g=0;g<arraybusqueda.size();g++){
				log.debug("comparando >>> arraybusqueda.get(g).getRUC():"+arraybusqueda.get(g).getRUC()+" y rucCliente: "+rucCliente);
				if(arraybusqueda.get(g).getRUC().equalsIgnoreCase(rucCliente)){
					temporal= arraybusqueda.get(g);
					break;
				}	
			}
		}
		
		log.debug("sabeeeeeee: "+temporal.getRAZONSOCIAL());
		return temporal;
	}
	
}
